;(function(){

  var App = {
    name: ''
  };

  // 配置
  App.cfg = {
    // debug模式
    debug: true,
    env: 'dev'
  };

  // 顺序预加载库
  App.libs = ['page', 'redux', 'store'];

  // 注入 tag.app 全局方法&属性
  App.mixin = pip.emitter({

    cfg: App.cfg,

    // 项目 api 调用方法
    api: function(method, url, data, opts){

      var
      opts = opts || {},
      prefix = '//' + (App.cfg.env !== 'pub' ? App.cfg.env + '.' : ''),
      pw = {
        dev: {
          uid: 1,
          appkey: 'pwsite',
          'access_token': 'cb0cc1562bb48d4cdf0bc9051f0f87fd',
          'expire_timestamp': 1520397643
        }
      };

      // trigger 如果是类似 button 元素的设置 disabled
      if(opts.trigger) opts.trigger.disabled = true;
      App.mixin.loading = true;
      riot.update(App.mixin.loading);

      return pip.xhr(prefix+'sosho.cn/server/api/'+url, {
        method: method,
        data: data || {},
        headers: pip.assign(pw[App.cfg.env], opts.headers || {})
      }).on('done', function(resp){
        if(resp.errno != 0){
          App.mixin.log('API Error:', resp.errmsg);
          page.redirect('/500');
        }
      }).on('complete', function(){
        if(opts.trigger) opts.trigger.disabled = false;
        App.mixin.loading = false;
        riot.update(App.mixin.loading);
      });

    },

    // debug 开启显示
    log: function(msg){
      App.cfg.debug &&
      window.console &&
      console.log(msg);
    }

  });

  if(pip.ie() && pip.ie() < 9){
    alert('请升级您的浏览器.');
  }

  // 当项目用到 Promise 兼容低版本
  if('Promise' in window === false){
    App.libs.push('promise');
  }

  pip.xhr('dist/rvm.json').on('done', function(rvm){

    // _merge 必加载
    var resource = [rvm.tags._merge];

    // lib 路径获取
    App.libs.forEach(function(lib, i){
      resource.push(rvm.libs[lib]);
    });

    // lib 加载
    pip.load.apply(pip, resource).on('done', function(){

      var _cache_page;

      // Page 路由 ～～～～～～～～～～～～～～～～～～～～～
      var loadPage = function(ctx, next){

        var p = (ctx.params.page || 'index'),
        action = ctx.params.action || '',
        tab = ctx.params.tab || '',
        query = pip.search2obj(ctx.querystring),
        path = ctx.pathname;

        if(!rvm.tags[p]){
          return page.redirect('/404');
        }

        App.mixin.route = {
          page: p,
          action: action,
          tab: tab,
          query: query,
          path: path,
          search: function(obj, force){
            if(force){
              page(path+'?'+pip.serialize(obj));
            }
            else{
              page(path+'?'+pip.serialize(pip.assign(query, obj)));
            }
          }
        }

        riot.mixin({App: App.mixin});

        if(p === _cache_page){
          // 无需remount page tag
          riot.update(App.mixin);
          return App.mixin.emit('reload');
        }

        try{
          pip.load(rvm.tags[p])
          .on('done', function(){
            _cache_page = p;
            riot.mount('#app', 'page-' + p);
          });
        } catch(e) {
          console.error(e);
          page.redirect('/500');
        }

      };

      // 路由中间件
      page(function(ctx, next){
        if (ctx.init) {
          next();
        } else {
          // 这里可以写一些页面切换的过渡效果
          next();
        }
      });

      // 宽泛匹配处理
      page('/:page?/:action?', loadPage);

      // 没有找到匹配处理
      page(function(){
        pip.load(rvm.tags['404'])
        .on('done', function(){
          riot.mount('#app', 'page-404');
        });
      });

      // #! SEO 动态渲染内容
      page({ hashbang: true });

    });

  })

})();
